package com.boxman

import android.annotation.SuppressLint
import android.content.res.AssetManager
import android.graphics.BitmapFactory

import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize

// 基本游戏物体
open class BaseGameObject {
    // 移动结果
    class MoveResult {
        // 结果
        enum class Result {
            CANNOT_MOVE,        // 本身不具有移动能力
            NO_MOVE,            // 没有移动
            NORMAL_MOVED,       // 正常移动
            ARRIVED_ON_DEST,    // 移动到目标上
            LEFT_FROM_DEST      // 离开目标
        }

        var result = Result.CANNOT_MOVE // 移动结果
    }

    // 类型
    enum class Type {
        NOTHING,        // 什么也没有
        WALL,           // 墙
        BACKGROUND,     // 背景
        DESTINATION,    // 箱子的目的地
        BOX,            // 箱子
        MAN             // 小人
    }

    protected lateinit var mImage: ImageBitmap  // 图片
    protected var mType: Type                   // 类型
    protected var mX: Int
    protected var mY: Int

    companion object {
        var sSize: Int = 0                      // 尺寸
    }

    /**
     * 构造方法。
     * @param assetManager  资产管理者
     * @param type          类型
     * @param x, y          左上角坐标
     */
    @SuppressLint("DefaultLocale")
    constructor(assetManager: AssetManager, type: Type, x: Int, y: Int) {
        // 初始化成员
        mType = type
        mX = x
        mY = y

        // 加载图片
        try {
            val imageFilePath = String.format(Const.IMAGE_FILE_PATH, type.ordinal)
            val inputStream = assetManager.open(imageFilePath)
            mImage = BitmapFactory.decodeStream(inputStream).asImageBitmap()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /**
     * 绘制自身。
     * @param drawer    绘图者
     */
    open fun draw(drawer: DrawScope) {
        drawer.drawImage(
            image = mImage,
            srcSize = IntSize(mImage.width, mImage.height),
            dstOffset = IntOffset(mX * sSize, mY * sSize),
            dstSize = IntSize(sSize, sSize)
        )
    }

    /**
     * 获取类型。
     * @return 类型
     */
    fun getType(): Type {
        return mType
    }

    /**
     * 移动。
     * @param direction     方向
     * @param moveResult    移动结果
     * @return 被推动的箱子
     */
    open fun move(direction: Int, moveResult: MoveResult): BaseGameObject? {
        moveResult.result = MoveResult.Result.CANNOT_MOVE
        return null
    }
}
